package com.googlecode.cswish.util;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.log4j.Logger;

/**
 * @author Jerry.Feng date 2005-7-9 20:31:42
 */
public class FormatUtils {
	private static final Logger logger = Logger.getLogger(FormatUtils.class);
	public static final String FORMAT = "yyyy-MM-dd";
	public static final String FORMAT_DETAIL = "yyyy-MM-dd HH:mm:ss";

//	public static DateFormat DB_DATE_FORMAT = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
//	public static DateFormat DB_DATE_FORMAT_YMD = new java.text.SimpleDateFormat("yyyyMMdd");
    public static DateFormat DATE_FORMAT = new java.text.SimpleDateFormat(FORMAT);
    public static DateFormat DATE_FORMAT_DETAIL = new java.text.SimpleDateFormat(FORMAT_DETAIL);
    
	public static Date getCurrentDate() {
        return new Date();
    }
	
	public static Date parseDate(String value) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		
		if (FORMAT.length() >= value.length()) {
			return parseDate(value, DATE_FORMAT);
		} else {
			return parseDate(value, DATE_FORMAT_DETAIL);
		}
	}
	
	public static Date parseDate(String value, String format) {
		DateFormat dateFormat = new java.text.SimpleDateFormat(format);		
		return parseDate(value, dateFormat);
	}
	
	private static Date parseDate(String value, DateFormat dateFormat) {
		dateFormat.setLenient(true);
        Date date = null;
		try {
			date = dateFormat.parse(value.toString());
		} catch (ParseException ex) {
			logger.error(ex);
		}
        
        return date;
	}
	
//	public static String date2Str(String sDate) {
//		if (StringUtils.isNotEmpty(sDate)) {
//			try {
//				String fDate;
//				if (sDate.length() == 8) {
//					Date date = DB_DATE_FORMAT_YMD.parse(sDate);
//					fDate = date2Str(date, DATE_FORMAT_YMD);
//				} else {
//					Date date = DB_DATE_FORMAT.parse(sDate);
//					fDate = date2Str(date, FORMAT_DETAIL);
//				}
//				return fDate;
//			} catch (ParseException e) {
//				logger.error(sDate + " isn't a valid date");
//			}
//		}
//		return "";
//	}
	
	public static String date2Str(Date date) {
		return date2Str(date, DATE_FORMAT);
	}
	
	public static String date2Str(Date date, String format) {
		DateFormat dateFormat = new java.text.SimpleDateFormat(format);		
		return date2Str(date, dateFormat);
	}
	
	public static String date2Str(Date date, DateFormat dateFormat) {
		if (date != null) {
			return dateFormat.format(date);
		} else {
			return null;
		}
	}
	
	public static Long str2Long(String str) {
		if (NumberUtils.isDigits(str)) {
			return new Long(str);
		}
		return null;
	}
	
	public static Integer str2Integer(String str) {
		if (NumberUtils.isDigits(str)) {
			return new Integer(str);
		}
		return null;
	}

	public static Double str2Double(String str) {
		if (NumberUtils.isNumber(str)) {
			return new Double(str);
		}
		return null;
	}

	public static BigDecimal str2Decimal(String str) {
		if (NumberUtils.isNumber(str)) {
			return new BigDecimal(str);
		}
		return null;
	}

	public static String double2Str(Double dbl) {
		if (dbl == null) {
			return null;
		}
		return dbl.toString();
	}

	public static String decimal2Str(BigDecimal decimal) {
		if (decimal == null) {
			return null;
		}
		return decimal.toString();
	}
	
	public static String quote(String x) {
		if (x == null) {
            return "";
        }
		return quote(x, x.length());
	}
	
	public static String quote(String x, int maxLength) {
        if (x == null) {
            return null;
        }
        int len = x.length();
        if (len > 0) {
        	len = len > maxLength ? maxLength : len;
            StringBuffer sb = new StringBuffer(len + 20);

            for (int i = 0; i < len; i++) {
                char c = x.charAt(i);
                switch (c) {
                    case '&':
                        sb.append("&amp;");
                        break;
                    case '\\':
                        sb.append("&quot;");
                        break;
                    case '<':
                        sb.append("&lt;");
                        break;
                    case '>':
                        sb.append("&gt;");
                        break;
                    case ' ':
                    	sb.append("&nbsp;");
                    	break;
                    case '\n':
                    	sb.append("<br>");
                    	break;
                    default:
                        sb.append(c);
                    	break;
                }
            }

            if (x.length() > maxLength) {
            	sb.append("...");
            }
            x = sb.toString();
        }
        return x;
    }
}
